package com.ExcelServer.util;


import cn.hutool.core.util.RandomUtil;
import com.googlecode.aviator.AviatorEvaluator;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 数学公式校验器
 * */

@Component
public class EquationVerification {
     public boolean verification(String equation){
         //equation 这个等式是不确定性的，可能是 x + y = c ，可能是 _3= (_1 >= 150) ? (1 * _2) : ((150 - _1) / 150 * _2)或者是其他更复杂的等式

         // 验证 equation 这一等式的合法性，若是合法返回true，否则返回false

         try {
             // 移除空格
             equation = equation.replaceAll("\\s+", "");

             // 检查等式是否为空
             if (equation.isEmpty()) {
                 return false;
             }
             List<String> operands = new ArrayList<>();
             Pattern pattern = Pattern.compile("_\\d+");
             Matcher matcher = pattern.matcher(equation);
             while (matcher.find()) {
                 String operand = matcher.group();
                 operands.add(operand);
                 //判断等式左边是结果还是右边是结果 一般来说，唯一在一边的是结果
             }

             String[] parts = equation.split("=");
             String result = parts[0];
             if(parts[0].length()>parts[1].length()){
                 result=parts[1];
             }


             int maxAttempts = 3; // 最大尝试次数

             boolean isEquationValid = false; // 公式是否成立的标志

             for (int i = 0; i < maxAttempts; i++) {
                 String temp = equation;
                 // 随机赋值验证公式是否成立
                 for (String operand : operands) {
                     if (!operand.equals(result)) {
                         temp = temp.replaceAll(operand, String.valueOf(RandomUtil.randomDouble()));
                     }
                 }

                 try {
                     AviatorEvaluator.execute(temp);
                     isEquationValid = true; // 如果没有抛出异常，说明公式成立
                     break;
                 } catch (Exception e) {
                     // 异常捕获，继续下一次循环尝试
                 }
             }

             if (isEquationValid) {
                 System.out.println("公式成立");
                 return true;
             } else {
                 System.out.println("公式错误");
                 return false;

             }

             // 验证等式是否合法
         } catch (Exception e) {
             return false;
         }

     }
}
